//
//  AutoAdjustLabel.swift
//  SlaughterClient
//
//  Created by hudan on 2025/4/9.
//  Copyright © 2025 zwb. All rights reserved.
//

import UIKit

// 根据文字内容自适应字体大小的 Label
class AutoAdjustLabel: UILabel {
    
    // 字体大小的默认范围
    private var minimumFontSize: CGFloat = 10.0
    private var maximumFontSize: CGFloat = 17.0
    
    // 最大行数，默认为2行
    private var maxLines: Int = 2 {
        didSet {
            numberOfLines = maxLines
            adjustTextSize()
        }
    }
    
    // 是否使用粗体
    private var isBold: Bool = false {
        didSet {
            updateFontStyle()
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupLabel()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupLabel()
    }
    
    /// 初始化 Label 的基本设置
    private func setupLabel() {
        numberOfLines = maxLines
        adjustsFontSizeToFitWidth = true
        minimumScaleFactor = minimumFontSize / maximumFontSize
        lineBreakMode = .byTruncatingTail
        updateFontStyle()
    }
    
    /// 设置最大显示行数
    /// - Parameter lines: 最大行数，最小为1
    func setMaxLines(_ lines: Int) {
        maxLines = max(1, lines)
        numberOfLines = maxLines
        adjustTextSize()
    }
    
    /// 设置字体样式
    /// - Parameter bold: 是否使用粗体
    func setFontStyle(bold: Bool) {
        isBold = bold
    }
    
    /// 设置字体大小范围
    /// - Parameters:
    ///   - min: 最小字体大小
    ///   - max: 最大字体大小
    func setFontSizeRange(min: CGFloat, max: CGFloat) {
        guard min <= max else { return }
        minimumFontSize = min
        maximumFontSize = max
        minimumScaleFactor = minimumFontSize / maximumFontSize
        adjustTextSize()
    }
    
    private func updateFontStyle() {
        let fontSize = font?.pointSize ?? maximumFontSize
        font = isBold ?
            .boldSystemFont(ofSize: fontSize) :
            .systemFont(ofSize: fontSize)
        adjustTextSize()
    }
    
    override var text: String? {
        didSet {
            adjustTextSize()
        }
    }
    
    override var bounds: CGRect {
        didSet {
            if bounds.size != oldValue.size {
                adjustTextSize()
            }
        }
    }
    
    // 调整文本大小以适应 Label 大小
    private func adjustTextSize() {
        guard let text = text, !text.isEmpty else { return }
        let size = bounds.size
        guard size.width > 0 && size.height > 0 else { return }
        
        // 获取当前字体或创建默认字体
//        let currentFont = font ?? (isBold ?
//            .boldSystemFont(ofSize: maximumFontSize) :
//            .systemFont(ofSize: maximumFontSize))
        
        var minSize = minimumFontSize
        var maxSize = maximumFontSize * 2
        var bestSize = minimumFontSize
        
        // 使用二分查找寻找最佳字体大小
        while maxSize - minSize > 0.5 {
            let midSize = (minSize + maxSize) / 2
            let testFont: UIFont = isBold ?
                .boldSystemFont(ofSize: midSize) :
                .systemFont(ofSize: midSize)
            
            // 计算文本边界
            let constraintSize = CGSize(
                width: size.width,
                height: .greatestFiniteMagnitude
            )
            
            let attributedText = NSAttributedString(
                string: text,
                attributes: [.font: testFont]
            )
            
            let boundingRect = attributedText.boundingRect(
                with: constraintSize,
                options: [.usesLineFragmentOrigin, .usesFontLeading],
                context: nil
            )
            
            // 计算需要的行数
            let neededLines = ceil(boundingRect.height / testFont.lineHeight)
            
            // 判断当前字体大小是否合适
            if neededLines <= CGFloat(maxLines) && boundingRect.height <= size.height {
                bestSize = midSize
                minSize = midSize
            } else {
                maxSize = midSize
            }
        }
        
        let finalSize = min(bestSize, maximumFontSize)
        font = isBold ?
            .boldSystemFont(ofSize: finalSize) :
            .systemFont(ofSize: finalSize)
    }
}
